import axios from "axios";
import { Message, MessageBox } from "element-ui";
import auth from "@/utils/auth";
import router from "../router";

// 创建axios实例
const service = axios.create({
  // api 的 base_url
  baseURL: Server.serverUrl,
  timeout: 30000 // 请求超时时间
});

let IsOpenTimeOutDialog = false; //是否已打开了登录超时的弹框-只弹出一次
let apiCount = 0; // api请求数量

// api请求数量加 1
const addApiCount = () => {
  if (apiCount === 0) {
    // 启动loading
  }
  apiCount += 1;
};
// api请求数量减 1
const subApiCount = isError => {
  apiCount -= 1;
  if (apiCount <= 0 || isError) {
    // 关闭loading
    apiCount = 0;
    return;
  }
};

// request拦截器
service.interceptors.request.use(
  config => {
    //区分接口对应的平台

    config.headers["system-tag"] = 0;
    !config.unloading && addApiCount();
    if (config.needNoToken) {
      return config;
    }
    if (auth.token) {
      config.headers["Authorization"] = "Bearer " + auth.token; // 让每个请求携带自定义token 请根据实际情况自行修改
    } else {
      config.headers["Authorization"] = "Basic V0VCQVBQOldFQkFQUA==";
    }
    return config;
  },
  error => {
    subApiCount(true);
    // Do something with request error
    console.log(error); // for debug
    Promise.reject(error);
  }
);

// response 拦截器
service.interceptors.response.use(
  response => {
    /**
     * code为非20000是抛错 可结合自己业务进行修改
     */
    subApiCount();
    const res = response.data;
    if (res.code) {
      if (
        res.code != "000000" &&
        res.code != "000000000" &&
        /^98/.test(res.code) &&
        !response.config.exception
      ) {
        //自定义异常处理不走默认异常处理
        Message({
          message: res.message,
          showClose: true,
          type: "error"
        });
        // MessageBox.alert(res.message, "错误提示");

        // 50008:非法的token; 50012:其他客户端登录了;  50014:Token 过期了;

        return response.data;
      } else {
        return response.data;
      }
    } else {
      //oauth/token会走这里
      return response.data;
    }
  },
  error => {
    subApiCount(true);
    if (!error.response) {
      //timeout 15s
      MessageBox.alert("数据请求超时，请重新尝试", "错误提示");
      return false;
    }

    //98开头的code吗 或者 自定义异常处理不走默认异常处理 010090066的code是参数模板状态发生变化的状态码
    if (
      (error.response.data && /^98/.test(error.response.data.code)) ||
      (error.response.config && error.response.config.exception)
    ) {
      return error.response.data;
    }

    const { status } = error.response;
    //解决设置IsOpenTimeOutDialog后第一次登录失败无法提示
    if (status != 401) {
      IsOpenTimeOutDialog = false;
    }

    if (!IsOpenTimeOutDialog) {
      let errMsg =
        (error.response &&
          error.response.data &&
          error.response.data.data &&
          error.response.data.data.error_description) ||
        (error.response &&
          error.response.data &&
          error.response.data.message) ||
        (error.response && error.response.statusText) ||
        error.message;
      MessageBox.alert(errMsg, "错误提示");
    }

    if (status == 401) {
      router.push("/login");
      IsOpenTimeOutDialog = true;
    }

    return Promise.reject(error);
  }
);

export default service;
